ロールバックの簡易テストみたいなことをChatGPTを使って、というか使われてというかだけどやってみました。
得たデータはこちら
pred frame 1 | x= 1 | local= 1 | remote= 0
pred frame 2 | x= 2 | local= 1 | remote= 0
pred frame 3 | x= 3 | local= 1 | remote= 0
pred frame 4 | x= 4 | local= 1 | remote= 0
pred frame 5 | x= 5 | local= 1 | remote= 0
[Network] Late remote input for frame 3 arrived. true_remote_input[3] = 1, predicted = 0
pred frame 6 | x= 6 | local= 1 | remote= 0
[Rollback] Mismatch detected at frame 3. Re-simulating from frame 3 to 6 using correct inputs.
re-sim frame 3 | x= 4 | local= 1 | remote= 1
re-sim frame 4 | x= 5 | local= 1 | remote= 0
re-sim frame 5 | x= 6 | local= 1 | remote= 0
re-sim frame 6 | x= 7 | local= 1 | remote= 0
5フレーム目までは予測だけの世界が続いていて、ローカル入力が毎フレーム +1
リモート入力は届いてないので全部 0 で予測している
だからシンプルに x = フレーム番号 みたいな動きになっている。
6フレームのところで、3フレーム目のリモートが +1 でした。という事実が届いて、不一致が検出されたってことで、正しい入力を使用して3フレームから6フレームを再シミュレーションしているということだ。
やっていることをまとめると
- 入力が揃ってなくても、とりあえず予測で進める
- 後から「過去フレームの真の入力」が届く
- 予測と違っていたら、そのフレームまで時間を巻き戻す
- 巻き戻した地点から「今までに届いているすべての真の入力」と「まだ届いてないところは予測入力」を使って現在フレームまで一気に再計算
GGPOがやっていることはこれのもっと巨大でお利口さんなシステムということらしいのだ。わかったようなわからんような。
テストの内容は
struct GameState
{
int frame;
int x;
};
GameStateというのを用意して、3フレーム目に遅延していてってところはハードコーディングして遅延があったら再計算する。という超簡単なコードになっている
つづく